package pers.ree.demo.base;

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class StringDemo {

    @Test
    public void stringJoin() {
        List<String> list = new ArrayList();

        list.add("a");
        list.add("b");
        list.add("c");

        // String.join底层使用StringJoiner，StringJoiner底层使用StringBuilder
        System.out.println(String.join(",", list)); // 可以使用一个Iterable的子类(接口)，比如List
        System.out.println(String.join("", "h", "e", "r")); // 也可以使用不定长的字符串参数
    }

    @Test
    public void printLength() {
        String s = new String();
        System.out.println(s.length());
    }

    @Test
    public void intern1() {

        String s1 = new String("ab");
        String s2 = new String("ab");

        String s3 = s1.intern();
        String s4 = s2.intern();

        String s5 = s1 + s2;
        String s6 = s5.intern();

        // 打印对象的内存地址
        System.out.println(System.identityHashCode(s1)); // identityHashCode=553264065
        System.out.println(System.identityHashCode(s2)); // identityHashCode=897697267
        System.out.println(System.identityHashCode(s3)); // identityHashCode=1496724653
        System.out.println(System.identityHashCode(s4)); // identityHashCode=1496724653
        System.out.println(System.identityHashCode(s5)); // identityHashCode=1789447862
        // 会在常量池新增一个指向s5的引用（在常量池中记录首次出现的实例引用）
        System.out.println(System.identityHashCode(s6)); // identityHashCode=1789447862

        String s = "ab";
        String s7 = "abab";

        // 打印对象的内存地址
        System.out.println(System.identityHashCode(s)); // identityHashCode=1496724653
        // 常量池已经存在一个指向s5的引用，指向该引用
        System.out.println(System.identityHashCode(s7));
    }

    @Test
    public void intern2() {
        String s = "ab";
        String s7 = "abab";

        // 打印对象的内存地址
        System.out.println("s="+System.identityHashCode(s)); // identityHashCode=1496724653
        // 常量池新增"abab"常量
        System.out.println("s7="+System.identityHashCode(s7));

        String s1 = new String("ab");
        String s2 = new String("ab");

        String s3 = s1.intern();
        String s4 = s2.intern();

        String s5 = s1 + s2;
        String s6 = s5.intern();

        String s8 = s + s;
        String s9 = "ab" + "ab";

        // 打印对象的内存地址
        System.out.println("s1="+System.identityHashCode(s1)); // identityHashCode=553264065
        System.out.println("s2="+System.identityHashCode(s2)); // identityHashCode=897697267
        System.out.println("s3="+System.identityHashCode(s3)); // identityHashCode=1496724653
        System.out.println("s4="+System.identityHashCode(s4)); // identityHashCode=1496724653
        // 使用对象引用方式拼接的字符串不会进常量池
        System.out.println("s5="+System.identityHashCode(s5)); // identityHashCode=1789447862
        // intern结果常量池中的常量地址
        System.out.println("s6=" + System.identityHashCode(s6)); // identityHashCode=553264065
        // 使用对象引用方式拼接的字符串不会进常量池
        System.out.println("s8=" + System.identityHashCode(s8)); // identityHashCode=1942406066
        // 使用字符串字面量拼接的结果指向常量池的常量（如果没有则新建）
        System.out.println("s9=" + System.identityHashCode(s9)); // identityHashCode=553264065
    }

    @Test
    public void isUniqueTest() {
        String s = "abc";
        Assert.assertTrue(isUnique(s));
    }

    private boolean isUnique(String astr) {
        Set<Character> set = new HashSet<>();
        char[] charArray = astr.toCharArray();
        for (char c: charArray) {
            set.add(c);
        }
        return set.size() == astr.length();
    }
}
